為何 Azure CLI / SDK / Portal / PowerShell 的行為可以一致,背後的邏輯其實就是 Azure REST API。
可以用 chrome dev tool 查看 Azure Cloud Shell,能發現使用許多 Azure Restful API
用 Azure CLI 搭配 --debug
option 做驗證,能發現底層也都是 TCP 的 Restful API 傳輸
az group list --debug
最簡單方式,使用 Azure CLI 提供封裝好的 restful 工具 : az rest
az rest -m put --header "Accept=application/json" -u 'https://management.azure.com/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}?api-version=2020-06-01' --body "{\"location\": \"eastasia\"}"
實際執行效果
weihan@Azure:~$ az rest -m put --header "Accept=application/json" -u 'https://management.azure.com/subscriptions/c905f1a3-b790-47cb-98f5-eb7b89d7d768/resourcegroups/weidemo20201013?api-version=2020-06-01' --body "{\"location\": \"eastasia\"}"
{
"id": "/subscriptions/c905f1a3-b790-47cb-98f5-eb7b89d7d768/resourceGroups/weidemo20201013",
"location": "eastasia",
"name": "weidemo20201013",
"properties": {
"provisioningState": "Succeeded"
},
"type": "Microsoft.Resources/resourceGroups"
}
不依賴 Azure rest CLI 方式 :
實際情況中,不是每個環境都有 Azure CLI
,這時可以使用 Azure Restful API 管理資源,並且這是依靠 TCP
可以讓 Java、C#、Python、Curl 跨多平台
環境都能輕鬆實作,並做到相同行為
效果。
第一步 : 需要建立 Azure Active Directory 來進行自動化身份驗證
az ad sp create-for-rbac --name [APP_NAME]
第二步 : 因為 Azure API 使用 OAuth2
協議,所以我們需要先獲取 token
,將剛才取得的 appId、password、tenant
替換以下的 curl 參數
curl -X POST -d 'grant_type=client_credentials&client_id=[APP_ID]&client_secret=[PASSWORD]&resource=https%3A%2F%2Fmanagement.azure.com%2F' https://login.microsoftonline.com/[TENANT_ID]/oauth2/token
第三步 : 使用 az account list --output table --query '[].{Name:name, SubscriptionId:id}'
找到 SubscriptionId
第四部 : 使用 curl + token 發送請求建立群組
curl -X PUT -H "Accept=application/json" -H "Content-Type: application/json" -H "Authorization: Bearer <<token>>" --data '{"location": "eastasia"}' https://management.azure.com/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}?api-version=2020-06-01
Q. 為何 Azure CLI 數據量大的時候,就算使用 JMESPath 篩選資料,查詢速度一樣沒變?
A. 使用 az consumption usage list --query "[0]" --debug
抓取第一筆資料,可以發現 Azure 是將全部
資料丟回,沒有在 Server 篩選,運算壓力直接放在 Client ,除非有提供 filter 參數
,才能啟用 server 端篩選,舉例 :
az consumption usage list -s '2020-10-12' -e '2020-10-14' --query "[0]" --debug
會轉成以下包含 filter 的 reqeust ,並在 azure server 只取回 10/12-10/14 號的資料
https://management.azure.com:443 "GET /subscriptions/c905f1a3-b790-47cb-98f5-eb7b89d7d768/providers/Microsoft.Consumption/usageDetails?$filter=properties%2FusageEnd%20ge%20%272020-10-12T00%3A00%3A00Z%27%20and%20properties%2FusageEnd%20le%20%272020-10-14T00%3A00%3A00Z%27&api-version=2018-01-31 HTTP/1.1"
Tip : 藉由 --debug
option,可以不用打開 Azure 文件查詢,直接查 http_logger : Request
資料就可以知道 Azure CLI 對應的 API 跟使用方式,很方便。